package org.example.utils;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 李国树
 * @version 1.0
 * @Desc
 * @date 2023/11/24 13:58
 */
public class ThreadPoolUtils {
    private static ThreadPoolExecutor threadPoolExecutor;

    static {
        //获取cpu核心数
        int i = Runtime.getRuntime().availableProcessors();
//核心线程数
        int corePoolSize = i * 2;
//最大线程数
        int maximumPoolSize = i * 2;
//线程无引用存活时间
        long keepAliveTime = 60;
//时间单位
        TimeUnit unit = TimeUnit.SECONDS;
//任务队列，接收一个整型的参数，这个整型参数指的是队列的长度，
/**
 *    【1】有界阻塞队列，先进先出，存取相互排斥
 * 　　【2】数据结构：静态数组（容量固定须指定长度，没有扩容机制，没有元素的位置也占用空间，被null占位）
 * 　　【3】ReentrantLock锁保证互斥性：存取都是同一把锁，操作的是同一个数组对象，存取相互排斥
 * 　　【4】阻塞对象（notEmpty【出队：队列count=0，无元素可取时，阻塞在该对象上】，notFull【入队：队列count=length，放不进元素时，阻塞在该对象上】）
 * 　　【5】入队，从队首开始添加元素，记录putIndex（到队尾时设置为0），唤醒notEmpty
 * 　　【6】出队，从队首开始添加元素，记录takeIndex（到队尾时设置为0），唤醒notFull
 * 　　【7】两个指针都是从队首向队尾移动，保证队列的先进先出原则（亮点：利用指针和数组，形成环状结构，重复利用内存空间）
 */
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue(i * 2 * 10);
//线程工厂
//defaultThreadFactory()
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
//拒绝执行处理器
        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
//创建线程池
        threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
    }

    public static ThreadPoolExecutor getThreadPoolExecutor() {
        return threadPoolExecutor;
    }
}

 
